var express = require('express');
var upload_bybackend_router = express.Router();
var fs = require('fs'); //前台传过来的是base64，需要解码成图片文件才可以上传
var qiniu = require("qiniu"); //七牛云sdk
var accessKey = 'jZqJJaylJQLuMvzSQ7UarZd3mqSUvOpRYERnwF8L'; //公钥
var secretKey = '1sodQylkOmorqIESo-0q_qlv7USjhNl83EkCLwN1'; //私钥
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey); //创建各种上传凭证之前，我们需要定义好其中鉴权对象mac：
var config = new qiniu.conf.Config();
// 空间对应的机房
config.zone = qiniu.zone.Zone_z2; //七牛云华南区机房
//要上传的空间
bucket = 'hmytest'; //我的bucket名称,即文件的命名空间的名称
//自定义凭证有效期（示例2小时，expires单位为秒，为上传凭证的有效时间）
var options = {
	scope: bucket,
	expires: 7200
};

// 构建上传策略函数,生成token并设置回调的url以及需要回调给业务服务器的数据。
function uptoken() {
	var putPolicy = new qiniu.rs.PutPolicy(options);
	// putPolicy.callbackUrl = 'http://your.domain.com/callback'; //此处的回调服务器地址需要你的公网服务器地址,但是我直接在本地操作的,没有公网地址,所以就没有改动七牛云的example了,直接copy没改
	// putPolicy.callbackBody = 'filename=$(fname)&filesize=$(fsize)';
	let qiniuntoken = putPolicy.uploadToken(mac);
	return qiniuntoken; //返回token数据
}

let token = '' //token
//上传图片前获取
upload_bybackend_router.post('/', function (req, res, next) {
	// 方法二：上传图片流程的思路(通过后台上传图片)：
	// 1.接收token前的操作
	// 说明：前台点击上传图片的按钮时,【需要先把本地图片的名称以及图片字节流数据发给后台】,【或者把修改好后的需要重命名的图片名称以及图片字节流数据发给后台】,需要的流程如下：
	// 1.1前台上传本地图片的时候,需要获取本地图片的名称（用来赋值给下面的key,以便生成token）,然后同时把图片字节流一并发给后台,后台把文件名（此时文件名建议进行操作,重命名）称赋值给key
	// 1.2后台根据：key以及你的七牛云命名空间的名称即：bucket 生成token
	// 还有一种做法就是可以直接根据用户的公钥私钥直接生成token，本文采取直接使用公钥私钥方式生成token，无需文件名称的参与

	// 2.接受到token后的操作
	// 2.1后台生成token后, 把【token】以及【文件字节流】以及【文件名称：key】打包成一个对象,然后开始发送到七牛云

	// 3.具体代码：后台操作
	//生成上传 Token
	let key = req.body.key; //前台传过来的需要保持的文件的名称
	let fileData = req.body.fileData //前台发过来的文件流数据	
	console.log("前台传过来的文件名：", key)
	// console.log("前台传过来的文件流：", fileData)
	// 若收到前台发过来的数据非空，则开始上传图片
	if (key != null & fileData != null) {
		token = uptoken(); //生成token,用于后台实现图片上传的凭证
		console.log("七牛云上传图片的token:", token);
		var formUploader = new qiniu.form_up.FormUploader(config); //七牛云内置函数，会构建表单上传的所需要的的配置，我们无需知晓内部细节
		var putExtra = new qiniu.form_up.PutExtra(); //七牛云内置函数
		var readableStream = fileData; // 赋予可读的流
		console.log("前台传过来的文件流readableStream：", readableStream)

		var localFile = './upload_img/weteach_' + Date.now() +key; //在本地生成图片文件
		var base64 = readableStream.replace(/^data:image\/\w+;base64,/, ""); //去掉图片base64码前面部分data:image/png;base64
		var dataBuffer = new Buffer.from(base64, 'base64'); //把base64码转成buffer对象，
	  console.log(dataBuffer)
		// fs.writeFile(localFile, dataBuffer, function (err) { //用fs写入文件
		// 	console.log("开始写入文件")
		// 	if (err) {
		// 		console.log("文件写入失败,",err);
		// 		console.log("666666666")
		// 	} else {
		// 		console.log('写入成功！');
		// 		console.log("666666666999999999999999999");
		// 		key = Date.now()+ key
		// 		// 使用文件方式上传
		// 				formUploader.putFile(token, key, localFile, putExtra, function (respErr,
		// 					respBody, respInfo) {
		// 					if (respErr) {
		// 						console.log("图片上传错误")
		// 						throw respErr;
		// 					}
				
		// 					if (respInfo.statusCode == 200) {
		// 						console.log(respBody);
		// 						console.log("图片上传成功！");
		// 						res.send({
		// 							status: 200, //状态码200
		// 							msg: '图片上传成功!',
		// 							imgSrc: 'http://hmytest.humianyuan.cn/' + key
		// 						})
		// 					} else {
		// 						console.log(respInfo.statusCode);
		// 						console.log(respBody);
		// 						console.log("图片上传失败！");
		// 						res.send({
		// 							status: 400, //状态码200
		// 							msg: '图片上传失败!'
		// 						})
		// 					}
		// 					 // 上传之后删除本地文件
		// 					 fs.unlinkSync(localFile);
		// 				});				
		// 	}
		// })

		// 直接用文件流的方式不可以上传，就是直接base64数据流上传不了，前端通过base64也不行，但是明明七牛云有关于文件流可以直接上传的文档说明，很奇怪，待后期解决，也可能永远搁置，很奇怪是七牛云本身内置函数的问题，还是我的写法不对！
		// 表单上传函数，七牛云内置函数 需要token 文件名 文件流 putExtra这个应该用于配置参数之类的，我们也不用关， 最后一个是回调函数，不管上传成功与否，都会回调它
		formUploader.putStream(token, key, dataBuffer, putExtra, function (respErr,
			respBody, respInfo) {
			if (respErr) {
				throw respErr;
			}

			if (respInfo.statusCode == 200) {
				console.log(respBody);
				console.log("图片上传成功！")
			} else {
				console.log(respInfo.statusCode);
				console.log(respBody);
				console.log("图片上传失败！")
			}
		});
		// 若上传成功则返回告知前台上传成功
	}
});


module.exports = upload_bybackend_router;